﻿using BLevy.Datos.Interfases;
using BLevy.Entidad;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DapperExtensions;
using Dapper;

namespace BLevy.Datos.Repositories
{
    public interface IZonaRepository : IRepository<Zona>
    {
        IList<Zona> FindAllConProvinciaCiudadLocalidad();
        IList<Zona> FindAllActivos();
        IList<Zona> FindAllPorLocalidad(int localidad_id);
    }

    public class ZonaRepository : IZonaRepository
    {

        protected readonly IDbConnection _db;

        public ZonaRepository()
        {
            try
            {
                _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString());
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IList<Zona> FindAll()
        {
            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Zona>("SELECT * FROM ZONAS").ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IQueryable<Zona> Find(System.Linq.Expressions.Expression<Func<Zona, bool>> predicate)
        {
            throw new NotImplementedException();
        }

        public Zona FindById(int id)
        {
            string query = "SELECT * FROM ZONAS " +
               "WHERE ID = @id";
            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Zona>(query, new { id = id }).SingleOrDefault();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Add(Zona newEntity)
        {
            string query = "INSERT INTO ZONAS (PROVINCIA_ID, CIUDAD_ID, LOCALIDAD_ID, ZONA, ACTIVO, RECARGO) " +
                            "VALUES (@provincia_id, @ciudad_id, @localidad_id, @zona, @activo, @recargo)";
            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        provincia_id = newEntity.provincia_id,
                        ciudad_id = newEntity.ciudad_id,
                        localidad_id = newEntity.localidad_id,
                        zona = newEntity.zona,
                        activo = newEntity.activo
                    });
                }

            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Remove(int id)
        {
            string query = "UPDATE ZONAS SET ACTIVO = 0 " +
                "WHERE ID = @id";
            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new { id = id });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Modify(Zona entity)
        {
            string query = "UPDATE ZONAS SET PROVINCIA_ID = @provincia_id, CIUDAD_ID = @ciudad_id, " +
                "LOCALIDAD_ID = @localidad_id, ZONA = @zona, ACTIVO = @activo, RECARGO = @recargo " +
                "WHERE ID = @id";
            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        provincia_id = entity.provincia_id,
                        ciudad_id = entity.ciudad_id,
                        localidad_id = entity.localidad_id,
                        zona = entity.zona,
                        activo = entity.activo,
                        id = entity.id
                    });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IList<Zona> FindAllConProvinciaCiudadLocalidad()
        {
            string query = "SELECT * FROM ZONAS " +
                "INNER JOIN LOCALIDADES ON LOCALIDADES.ID = ZONAS.LOCALIDAD_ID " +
                "INNER JOIN CIUDADES ON CIUDADES.ID = ZONAS.CIUDAD_ID " +
                "INNER JOIN PROVINCIAS ON PROVINCIAS.ID = ZONAS.PROVINCIA_ID " +
                "ORDER BY ZONAS.ID ASC";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Zona, Localidad, Ciudad, Provincia, Zona>(query,
                        (zona, localidad, ciudad, provincia) =>
                        {
                            zona.provincia = provincia;
                            zona.ciudad = ciudad;
                            zona.localidad = localidad;
                            return zona;
                        },
                            splitOn: "id").ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }


        public IList<Zona> FindAllActivos()
        {
            string query = "SELECT * FROM ZONAS " +
                "WHERE ACTIVO = 1 " +
                "ORDER BY ID ASC";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Zona>(query).ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }


        public IList<Zona> FindAllPorLocalidad(int localidad_id)
        {
            string query = "SELECT * FROM ZONAS " +
                "WHERE LOCALIDAD_ID = " + localidad_id;

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Zona>(query).ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }
    }
}
